package grupo2.bj;

import grupo2.exceptions.LimiteSuperadoException;

import java.util.ArrayList;
import java.util.Collection;

public class Mesa {
	
	private Collection <Apostador> apostadores = new ArrayList<Apostador>();
	private Collection <Apostador> apostadoresQueJugaron = new ArrayList<Apostador>();//para la persistencia
	private Banca banca;
	private int limitePersonas;
	private static Mesa instancia;
	

/*-----------------------------------------------------*/	
	
	public int getLimitePersonas() {
		return limitePersonas;
	}
	
	public Collection<Apostador> getApostadores() {
		return apostadores;
	}
	
	public Collection<Apostador> getApostadoresQueJugaron() {
		return apostadoresQueJugaron;
	}
	
	public void setApostadores(Apostador apostador) {
		this.apostadores.add(apostador);
	}

	public static Mesa getInstance() {
		if (instancia == null)
			instancia = new Mesa(100);

		return instancia;
	}
	
	public static void setInstance(Mesa mesa) {
		instancia = mesa; //es para recuperar lo del xml persistido
	}

	public void setLimitePersonas(int limitePersonas) {
		this.limitePersonas = limitePersonas;
	}

	public void addApostador (Apostador unApostador) {
		if(this.apostadores.size() > this.getLimitePersonas())
			throw new LimiteSuperadoException("Mesa llena: no se pudo agregar el jugador:" + unApostador.getNombre());
		else
			apostadores.add(unApostador);
	}


/*-----------------------------------------------------*/

public void darCarta(Jugador unJugador){
	this.banca.darCarta(unJugador);
}
/*-----------------------------------------------------*/

/*public void determinarGanador(){
	for( Apostador a : apostadores){
		if(a.getPuntaje() >= this.banca.getPuntaje() && !a.mePase() || banca.mePase())
			banca.pagarApuesta(a);
		else
			banca.retirarDinero( a );
	}
}*/


public void determinarGanadores(){
	for( Apostador a : apostadores){
		a.determinarPuntaje();
	}
}

public boolean isGanador(Apostador a){
	a.destaparCartas(); //Destapa sus cartas para determinar el Resultado del juego
	return (!a.mePase() && (a.getPuntaje() >= this.banca.getPuntaje() || banca.mePase() || a.tengo6Cartas()));
}

public void realizarAccion(Apostador a){
	if(this.isGanador(a)){
		banca.pagarApuesta(a);
	}
	else{
		banca.retirarDinero( a );
	}
}
/*-----------------------------------------------------*/
public void jugar(){
	this.realicenApuestas();
	this.repartirCartas();
	for (Apostador a: apostadores)
		a.jugar();
	banca.jugar();
	this.determinarGanadores();
}

/*-----------------------------------------------------*/

public void repartirCartas(){
	for(int i=0;i<2;i++){
		for(Apostador a: apostadores)
			banca.darCarta(a);
		banca.darCarta(banca);
	}
}
/*-----------------------------------------------------*/
public int getCantAs() {
	int cantAs = 0;
	
	for(Apostador apostador: apostadores)
		cantAs += apostador.getCantAs();
	
	if(banca.mostrarPriCarta().isAs()){
		cantAs += 1;
	}	
	return cantAs;
}

/*-----------------------------------------------------*/
public boolean bancaTieneBJ(){
	return this.banca.tenesBJ();
}

/*-----------------------------------------------------*/
public void darCartaTapada(Jugador unJugador){
	this.banca.darCartaTapada(unJugador);
}
/*-----------------------------------------------------*/
public Banca getBanca() {
	return banca;
}
/*-----------------------------------------------------*/
public void setBanca(Banca banca) {
	this.banca = banca;
}
/*-----------------------------------------------------*/
public void realicenApuestas( ){
		for( Apostador a : apostadores){
			a.realizaApuesta();
		}
}

public void reset(){
	apostadores.removeAll(apostadores);
}

public Mesa(int limitePersonas) {
	this.limitePersonas = limitePersonas;
	this.setBanca(new Banca(new Sabot(), this));
}

public void setCantidadMazos(int cantMazos){
	this.getBanca().setCantidadMazos(cantMazos);
}

}
